<?php

namespace App\Services;

use App\Models\Bar;
use App\Models\BarMember;
use App\Models\User;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;

class BarService
{
    /**
     * 创建贴吧
     */
    public function createBar(User $user, array $data): Bar
    {
        return DB::transaction(function () use ($user, $data) {
            // 处理头像上传
            if (isset($data['avatar']) && $data['avatar'] instanceof \Illuminate\Http\UploadedFile) {
                $data['avatar'] = $data['avatar']->store('bars', 'public');
            }

            // slug 将由模型的 boot 方法自动生成（如果为空）
            // 如果用户提供了自定义 slug，则使用用户的

            // 创建贴吧，设置创建者为吧主
            $bar = Bar::create([
                'name' => $data['name'],
                'slug' => $data['slug'] ?? null, // 模型会自动生成
                'avatar' => $data['avatar'] ?? null,
                'description' => $data['description'] ?? null,
                'owner_id' => $user->id,
                'member_count' => 1, // 创建者自动成为第一个成员
                'post_count' => 0,
            ]);

            // 创建者在 bar_members 表中的记录（角色为 owner）
            BarMember::create([
                'bar_id' => $bar->id,
                'user_id' => $user->id,
                'role' => 'owner',
            ]);

            return $bar->load('owner');
        });
    }

    /**
     * 获取贴吧列表（支持搜索、分页）
     */
    public function getBarsList(?string $search = null, int $perPage = 15): LengthAwarePaginator
    {
        $query = Bar::with('owner')
            ->orderBy('member_count', 'desc')
            ->orderBy('created_at', 'desc');

        if ($search) {
            $query->where(function ($q) use ($search) {
                $q->where('name', 'like', "%{$search}%")
                    ->orWhere('description', 'like', "%{$search}%");
            });
        }

        return $query->paginate($perPage);
    }

    /**
     * 获取热门贴吧列表
     *
     * @param  int  $limit  返回数量
     * @param  bool  $includePostCount  是否按帖子数排序（用于首页侧边栏）
     */
    public function getPopularBars(int $limit = 10, bool $includePostCount = false): Collection
    {
        $query = Bar::with('owner');

        if ($includePostCount) {
            // 首页侧边栏：同时考虑成员数和帖子数
            $query->orderBy('member_count', 'desc')
                ->orderBy('post_count', 'desc');
        } else {
            // 其他场景：主要按成员数
            $query->orderBy('member_count', 'desc');
        }

        return $query->limit($limit)->get();
    }

    /**
     * 获取贴吧详情
     */
    public function getBarDetail(Bar $bar): Bar
    {
        return $bar->load(['owner', 'members.user']);
    }

    /**
     * 用户加入贴吧
     */
    public function joinBar(Bar $bar, User $user): BarMember
    {
        return DB::transaction(function () use ($bar, $user) {
            // 检查是否已经是成员
            $existingMember = BarMember::where('bar_id', $bar->id)
                ->where('user_id', $user->id)
                ->first();

            if ($existingMember) {
                return $existingMember;
            }

            // 创建成员记录
            $member = BarMember::create([
                'bar_id' => $bar->id,
                'user_id' => $user->id,
                'role' => 'member',
            ]);

            // 更新贴吧成员数
            $bar->increment('member_count');

            return $member;
        });
    }

    /**
     * 用户退出贴吧
     */
    public function leaveBar(Bar $bar, User $user): bool
    {
        return DB::transaction(function () use ($bar, $user) {
            // 吧主不能退出自己创建的贴吧
            if ($bar->owner_id === $user->id) {
                throw new \Exception('吧主不能退出自己创建的贴吧');
            }

            $deleted = BarMember::where('bar_id', $bar->id)
                ->where('user_id', $user->id)
                ->delete();

            if ($deleted) {
                // 更新贴吧成员数
                $bar->decrement('member_count');
            }

            return $deleted > 0;
        });
    }

    /**
     * 更新贴吧信息（仅吧主可操作）
     */
    public function updateBar(Bar $bar, User $user, array $data): Bar
    {
        // 检查权限
        if (! $bar->isOwner($user)) {
            throw new \Exception('只有吧主可以修改贴吧信息');
        }

        return DB::transaction(function () use ($bar, $data) {
            // 处理头像上传
            if (isset($data['avatar']) && $data['avatar'] instanceof \Illuminate\Http\UploadedFile) {
                // 删除旧头像
                if ($bar->avatar && Storage::disk('public')->exists($bar->avatar)) {
                    Storage::disk('public')->delete($bar->avatar);
                }

                $data['avatar'] = $data['avatar']->store('bars', 'public');
            }

            // 如果名称改变且未提供 slug，重新生成 slug（使用拼音）
            if (isset($data['name']) && $data['name'] !== $bar->name && ! isset($data['slug'])) {
                $data['slug'] = Bar::generateSlug($data['name']);
            }

            $bar->update($data);

            return $bar->fresh();
        });
    }

    /**
     * 更新贴吧统计信息（成员数、帖子数等）
     */
    public function updateBarStats(Bar $bar): void
    {
        $memberCount = BarMember::where('bar_id', $bar->id)->count();

        // 帖子数需要等阶段四实现后更新
        // $postCount = Post::where('bar_id', $bar->id)->count();

        $bar->update([
            'member_count' => $memberCount,
            // 'post_count' => $postCount,
        ]);
    }

    /**
     * 检查用户是否为贴吧成员
     */
    public function isMember(Bar $bar, User $user): bool
    {
        return BarMember::where('bar_id', $bar->id)
            ->where('user_id', $user->id)
            ->exists();
    }

    /**
     * 获取用户在贴吧中的角色
     */
    public function getUserRole(Bar $bar, User $user): ?string
    {
        $member = BarMember::where('bar_id', $bar->id)
            ->where('user_id', $user->id)
            ->first();

        if (! $member) {
            return null;
        }

        return $member->role;
    }
}
